#include "../thirdparty/log/log.h"
#include "ota_http.h"
#include <curl/curl.h>
#include <stdlib.h>
#include <string.h>

/**
 * @brief 回调函数，用于接收HTTP响应数据
 * @param ptr 接收到的数据
 * @param size 每个数据块的大小
 * @param nmemb 数据块的数量
 * @param userdata 用户自定义数据
 * @return 接收到的数据大小
 */
static size_t ota_http_writeCallback(char *ptr, size_t size, size_t nmemb, void *userdata)
{
    // 计算接收到的数据大小 
    size_t realsize = size * nmemb;
    char *json = (char *)userdata;
    // 将数据拷贝到json中
    memcpy(json, ptr, realsize);
    return realsize;
}

char *ota_http_getJson(char *url)
{
    // 初始化
    CURL *curl = curl_easy_init();
    if (curl == NULL)
    {
        log_error("curl_easy_init failed");
        return NULL;
    }
    char *json = malloc(1024); // 分配内存
    if (json == NULL)
    {
        log_error("malloc failed");
        return NULL;
    }
    // 设置URL
    curl_easy_setopt(curl, CURLOPT_URL, url);
    // 设置接收数据的回调函数
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ota_http_writeCallback);
    // 设置接收数据的回调函数的参数
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, json);
    // 执行请求
    CURLcode ack = curl_easy_perform(curl);

    if (ack != CURLE_OK)
    {
        // ota_http出错
        log_error("curl_easy_perform failed: %s", curl_easy_strerror(ack));
        free(json);
        return NULL;
    }
    return json;
}

int ota_http_downLoadFile(char *url, char *file_name)
{
    // 初始化
    CURL *curl = curl_easy_init();
    if (curl == NULL)
    {
        log_error("curl_easy_init failed");
        return -1;
    }
    // 设置URL
    curl_easy_setopt(curl, CURLOPT_URL, url);
    // 设置下载文件路径的回调函数
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
    FILE *file = fopen(file_name, "wb");
    // 设置下载文件路径的回调函数的参数
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
    // 执行请求
    CURLcode ack = curl_easy_perform(curl);
    if (ack != CURLE_OK)
    {
        // ota_http出错
        log_error("curl_easy_perform failed: %s", curl_easy_strerror(ack));
        fclose(file);
        return -1;
    }
    // 释放资源
    fclose(file);
    return 0;
}